#include <iostream>
#include <unistd.h>
#include <poll.h>

int main()
{
    //我们关心标准输入-0号描述符的读取事件是否就绪
    //因为标准输入有明显的读取事件就绪和不就绪的特征,也就是不给它输入数据就是不就绪,给它输入数据的话,读取事件就是就绪的
    struct pollfd rfds;
    rfds.fd = 0;//你要关心的文件描述符
    rfds.events = POLLIN; 
    rfds.revents = 0;

    //事件循环
    while(1)
    {
        int n = poll(&rfds, 1, 1000); //每隔1000ms即1s就timeout一次 1s之内有事件就绪就返回,没有事件就绪就timeout
        //int n = poll(&rfds, 1, 0); //非阻塞轮询
        //int n = poll(&rfds, 1, -1); //永久阻塞
        switch(n)
        {
            case 0://超时
                std::cout << "time out ..." << std::endl;
                break;
            case -1://出错
                std::cerr << "poll error" << std::endl;
                break;
            default:
                std::cout << "有事件发生..." << std::endl;
                //因为当前只关心0号描述符,不需要轮询检测哪个文件描述符的事件发生
                if(rfds.revents & POLLIN)   //判断读取事件是否发生
                {
                    std::cout << rfds.fd << " 上面的读事件发生了" << std::endl;
                   char buffer[128];
                   //从标准输入里读取,读到buffer中,我们认为读取到的是字符串,所以少读一个字节,方便后续放\0
                   ssize_t s = read(0, buffer, sizeof(buffer)-1);
                   if(s > 0)
                   {
                       buffer[s] = '\0';
                       std::cout << "有人说# " << buffer << std::endl;
                   }
                }
                break;
        }
    }
    return 0;
}
